package cn.dkk.Spring.framework.beans;

import com.sun.istack.internal.NotNull;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @author dkk
 * @date 2022/8/2
 * @desc 一个bean标签下可有多个property标签,MutablePropertyValues类用来管理bean标签下的多个property对象
 * @涉及涉及模式: 迭代器模式
 */
public class MutablePropertyValues implements Iterable<PropertyValue>{

    // 以list作为容器
    private final List<PropertyValue> propertyValueList;

    public MutablePropertyValues() {
        this.propertyValueList = new ArrayList<>();
    }

    public MutablePropertyValues(List<PropertyValue> propertyValueList) {
        if (propertyValueList!=null){
            this.propertyValueList = propertyValueList;
        }else {
            this.propertyValueList=new ArrayList<>();
        }
    }

    /**
     * 获取propertyValue数组
     * @return
     */
    public PropertyValue[] getPropertyValues(){
        return propertyValueList.toArray(new PropertyValue[0]);
    }

    /**
     * 根据property名称返回property对象
     * @return
     */
    public PropertyValue getPropertyValue(@NotNull String name){
        for (PropertyValue propertyValue : propertyValueList) {
            if (propertyValue.getName().equals(name)){
                return propertyValue;
            }
        }
        return null;
    }

    /**
     * 判断容器是否为null
     * @return
     */
    public boolean isEmpty(){
        return propertyValueList.isEmpty();
    }

    /**
     * 添加propertyValue
     * @param propertyValue
     * @return 当前对象,支持链式编程
     */
    public MutablePropertyValues add(PropertyValue propertyValue){
        // 判断当前对象中是否有和传递进来的对象的重复对象(名称相同),如果有,则进行覆盖
        for (int i = 0; i < propertyValueList.size(); i++) {
            if (propertyValueList.get(i).getName().equals(propertyValue.getName())){
                propertyValueList.set(i,propertyValue);
                return this;
            }
        }
        propertyValueList.add(propertyValue);
        return this;
    }

    /**
     * 判断容器中是否有指定名称的propertyValue
     * @param name
     * @return
     */
    public boolean contains(String name){
        return getPropertyValue(name)!=null;
    }

    /**
     * 迭代器
     * @return
     */
    @Override
    public Iterator<PropertyValue> iterator() {
        return propertyValueList.iterator();
    }
}
